HashMap
?
碼源解析
?
添加源碼解析
?
resize()
?
這個方法在putval中執行,因為要確保你數組不是null
?
resize就是重新計算容量;向HashMap對象里不停的添加元素,而HashMap對象內部的數組無法裝載更多的元素時,對象就需要擴大數組的長度,以便能裝入更多的元素;當然java里的數組是無法自動擴容的,方法是使用一個新的數組代替已有的容量小的數組;就像我們用一個小桶裝
putVal()
首次添加
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
? ? ? ? ? ? ? ? ? ?boolean evict) {
? ? ? ? Node<K,V>[] tab; Node<K,V> p; int n, i;
? ? ? ? if ((tab = table) == null || (n = tab.length) == 0)
? ? ? ? ? ? n = (tab = resize()).length;
? ? ? ? if ((p = tab[i = (n - 1) & hash]) == null)
? ? ? ? ? ? tab[i] = newNode(hash, key, value, null);
? ? ? ??
? ??
? ? ~~~~~
? ??
? ? ? ? ++modCount;
? ? ? ? if (++size > threshold)
? ? ? ? ? ? resize();
? ? ? ? afterNodeInsertion(evict);
? ? ? ? return null;
? ? }
if ((p = tab[i = (n - 1) & hash) == null)
初始化完成后,他會去根據數組長度-1與計算的hash碼進行與運算的出來放的數組位置,他會去看這個位置有沒有元素
有呢就創建一個Node放到這個位置就可以了
如果不是null那就只能鏈表操作了,那個操作等會說
if (++size > threshold)
? ? ? ?resize();
afterNodeInsertion(evict);
return null;
之后呢,我們要變更size的大小,因為size是記錄有多少個真正的元素在這個數組中,threshold就是臨界值,我們初始化好了,這個值就是12,這個if呢就是為了判斷,你添加到數組的元素,你不能大于這個臨界值,那你要是大于了,那我就去擴容去了,否則了那就沒事了
afterNodeInsertion(evict);
afterNodeInsertion(evict);
這玩意是為了LinkedHashMap服務的,是為了保證順序而存在的,在hashmap中沒意義。